package common

import (
	"encoding/json"
	"fmt"
	"net/http"
	"strconv"

	"gitee.com/wangshh_123/cross-pay-go/src/utils/common/i18n"
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
)

// Response 标准响应结构
type Response struct {
	Code string      `json:"code"`
	Msg  interface{} `json:"msg"`
	Data interface{} `json:"data,omitempty"`
}

// Success 成功响应
func Success(c *gin.Context, args ...interface{}) {
	var msg interface{} = i18n.GetMessages("success")
	var data interface{} = nil
	if len(args) == 1 {
		data = args[0]
	} else if len(args) >= 2 {
		msg = args[0]
		data = args[1]
	}

	// 直接输出 msg，不做语言选择
	c.JSON(http.StatusOK, Response{
		Code: "200",
		Msg:  msg,
		Data: data,
	})
}

// Error 发送错误响应
func Error(c *gin.Context, status int, msg interface{}, err error) {
	var message interface{}
	switch v := msg.(type) {
	case i18n.Message:
		message = gin.H{
			"cn": v.CN,
			"en": v.EN,
			"vn": v.VN,
		}
	case string:
		// 如果是字符串，尝试获取对应的i18n消息
		i18nMsg := i18n.GetMessages(v)
		if i18nMsg.CN != "" || i18nMsg.EN != "" || i18nMsg.VN != "" {
			message = gin.H{
				"cn": i18nMsg.CN,
				"en": i18nMsg.EN,
				"vn": i18nMsg.VN,
			}
		} else {
			// 如果没有找到对应的i18n消息，使用原始字符串
			message = v
		}
	default:
		message = msg
	}

	// 处理验证错误
	var errMsg interface{}
	if err != nil {
		if validationErr, ok := err.(validator.ValidationErrors); ok {
			// 将验证错误转换为更友好的格式
			errDetails := make(map[string]string)
			for _, e := range validationErr {
				field := e.Field()
				tag := e.Tag()
				errDetails[field] = fmt.Sprintf("%s validation failed on tag '%s'", field, tag)
			}
			errMsg = errDetails
		} else {
			// 检查错误消息是否是i18n消息键
			i18nMsg := i18n.GetMessages(err.Error())
			if i18nMsg.CN != "" || i18nMsg.EN != "" || i18nMsg.VN != "" {
				errMsg = gin.H{
					"cn": i18nMsg.CN,
					"en": i18nMsg.EN,
					"vn": i18nMsg.VN,
				}
			} else {
				errMsg = err.Error()
			}
		}
	}

	c.JSON(status, Response{
		Code: strconv.Itoa(status),
		Msg:  message,
		Data: errMsg,
	})
}

// ValidateRequiredParams 验证必要参数
func ValidateRequiredParams(c *gin.Context, params map[string]string) error {
	for key, value := range params {
		if value == "" {
			return fmt.Errorf("%s is required", key)
		}
	}
	return nil
}

// GetPaginationParams 获取分页参数
func GetPaginationParams(c *gin.Context) (int64, int64) {
	pageIndex, _ := strconv.ParseInt(c.DefaultQuery("pageIndex", "1"), 10, 64)
	pageSize, _ := strconv.ParseInt(c.DefaultQuery("pageSize", "10"), 10, 64)
	return pageIndex, pageSize
}

// GetInt64Query 获取int64类型的查询参数
func GetInt64Query(c *gin.Context, key string) (int64, error) {
	value := c.Query(key)
	if value == "" {
		return 0, fmt.Errorf("query parameter %s is empty", key)
	}
	return strconv.ParseInt(value, 10, 64)
}

// ProcessRequestBody 处理请求体
func ProcessRequestBody(c *gin.Context, v interface{}) error {
	bodyBytes, err := c.GetRawData()
	if err != nil {
		return fmt.Errorf("invalid request body")
	}

	if err := json.Unmarshal(bodyBytes, v); err != nil {
		return fmt.Errorf("invalid request format")
	}

	return nil
}

// PaginationResult 分页结果结构
type PaginationResult struct {
	Data       interface{} `json:"data"`
	Total      int64       `json:"total"`
	Page       int         `json:"page"`
	PageSize   int         `json:"page_size"`
	TotalPages int64       `json:"total_pages"`
}
